﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LGPeWJNM.DataAccessLayer
{
    /// <summary>
    /// Idenficação de uma instância
    /// </summary>
    public class IdInstancia : IEquatable<IdInstancia>
    {
        /// <summary>
        /// A qual classe de problemas a instância pertence
        /// </summary>
        public string Classe { get; set; }

        /// <summary>
        /// Nome da instância
        /// </summary>
        public string Instancia { get; set; }

        /// <summary>
        /// Gera uma identificação em branco
        /// </summary>
        public IdInstancia()
        {

        }

        /// <summary>
        /// Gera uma identificação com Classe e Instancia definida
        /// </summary>
        /// <param name="Classe">Nome da classe desta instância</param>
        /// <param name="Instancia">Nome da instância identificada por esta Id</param>
        public IdInstancia(string Classe, string Instancia)
            : this()
        {
            this.Classe = Classe;
            this.Instancia = Instancia;
        }

        /// <summary>
        /// Retorna o conteúdo em forma de string da identificação
        /// </summary>
        /// <returns>Classe/Instancia</returns>
        public override string ToString()
        {
            return string.Format("{0}/{1}", Classe, Instancia);
        }

        /// <summary>
        /// Identifica se duas instâncias são iguais
        /// </summary>
        /// <param name="other">A instância a ser comparada com a atual</param>
        /// <returns>Retorna true caso sejam iguais, retorna false caso contrário.</returns>
        public bool Equals(IdInstancia other)
        {
            return this.Classe.Equals(other.Classe) && this.Instancia.Equals(other.Instancia);
        }

        /// <summary>
        /// Returns the hash code for this IdInstancia.
        /// </summary>
        /// <returns>A 32-bit signed integer hash code.</returns>
        public override int GetHashCode()
        {
            return (this.Classe + this.Instancia).GetHashCode();
        }

        /// <summary>
        /// Determines whether this instance and another specified have the same value.
        /// </summary>
        /// <param name="obj">The instance to compare to this instance.</param>
        /// <returns>
        /// true if the value of the value parameter is the same as this instance; otherwise, false.
        /// </returns>
        public override bool Equals(object obj)
        {
            if (!(obj is IdInstancia))
                return false;
            var o = obj as IdInstancia;
            return this.Equals(o);
        }
    }
}
